package middle;

/**
 * 实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，xn ）。
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class PowxN {
    /**
     * 幂的运算特性之一： 同底不同幂，底数不变，幂数相加。
     * 那么 2^4 == 2^2 * 2^2.
     * 所以对于幂我们可以将其进行拆分。
     * 对于负数幂的结果 == 其正数幂结果的倒数。这个也比较好理解
     * */
    class Solution {
        public double myPow(double x, int n) {
            if(n == 0){
                return 1;
            }
            double result = pow(x , Math.abs(n));
            return n < 0 ? 1.0 / result : result;
        }

        double pow(double x, int n){
            if(n == 1){
                return x;
            }
            double pow = pow(x, n / 2);
            return n%2 == 0 ? pow * pow : x * pow * pow;
        }
    }
}
